/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.empr;

import com.perutaxi.entidades.eCliente;
import com.perutaxi.entidades.eEmpresa;
import com.perutaxi.entidades.eEmpresaTaxista;
import com.perutaxi.entidades.eTaxistaAuto;
import com.perutaxi.entidades.eTaxistaReclamo;
import com.perutaxi.entidades.eTaxistaServicio;
import com.perutaxi.entidades.eUsuario;
import com.perutaxi.negocio.nCliente;
import com.perutaxi.negocio.nEmpresa;
import com.perutaxi.negocio.nEmpresaTaxista;
import com.perutaxi.negocio.nTaxistaAuto;
import com.perutaxi.negocio.nTaxistaReclamo;
import com.perutaxi.negocio.nTaxistaServicio;
import com.perutaxi.negocio.nUsuario;
import com.perutaxi.util.GenericMBean;
import com.perutaxi.util.JavaMail;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author PeruTaxi
 */
@ManagedBean
@SessionScoped
public class EmpresaMBean extends GenericMBean implements Serializable {

    private eEmpresa empresaFiltro;
    private eEmpresa empresa;
    private eEmpresaTaxista empresaDeta;
    private eTaxistaAuto auto;
    private List<eEmpresa> lista;
    private int accion; //1:nuevo, 2:editar, 3:ver
    private int accionDetalle; //1:nuevo, 2:editar, 3:ver
    private int accionPopup1; //1:nuevo, 2:editar, 3:ver
    private String titulo; //titulo del panel
    private String tituloDetalle; //titulo del panel del detalle
    private String tituloPopup1;
    private final String url = "/pages/empr/empresa/empresa.xhtml";
    private final String urlLista = "/pages/empr/empresa/listaEmpresa.xhtml";
    private List<eTaxistaAuto> listaAutos;
    private List<eEmpresaTaxista> listaTaxistas;
    private List<eTaxistaServicio> listaServicios;
    private SelectItem[] siEstadosSexo;
    private SelectItem[] listaMarcas;
    private SelectItem[] listaModelos;
    private SelectItem[] listaColores;
    private Date fechaNacimiento;
    private eTaxistaServicio servicio;
    private Long idCliente;
    private List<eCliente> listaClientes;
    private Date fechaServicio;
    private List<eTaxistaReclamo> listaReclamos;

    public EmpresaMBean() {
    }

    public String iniciar() {
        empresaFiltro = new eEmpresa();
        empresaFiltro.setRuc("");
        empresaFiltro.setRazonSocial("");
        empresaFiltro.setEstado(Boolean.TRUE);
        lista = null;

        return this.urlLista;
    }

    public void buscar(ActionEvent ae) {
        try {
            this.lista = nEmpresa.obtenerEmpresa(this.empresaFiltro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String nuevo() {
        this.accion = 1;
        this.titulo = "NUEVO(A) EMPRESA";
        this.empresa = nEmpresa.inicializar();

        return this.url;
    }

    public void nuevoTaxista() {
        this.accionDetalle = 1;
        this.tituloDetalle = "NUEVO TAXISTA";
        this.fechaNacimiento = null;
        this.empresaDeta = nEmpresaTaxista.inicializar();
        this.empresaDeta.setEmpresa(this.empresa);
    }

    public void nuevoAuto() {
        this.accionPopup1 = 1;
        this.tituloPopup1 = "NUEVO AUTO";
        this.auto = nTaxistaAuto.inicializar();
        this.auto.setEmpTaxista(this.empresaDeta);
    }

    public void nuevoServicio() {
        this.accionPopup1 = 1;
        this.tituloPopup1 = "NUEVO SERVICIO";
        this.fechaServicio = null;
        this.servicio = nTaxistaServicio.inicializar();
        this.servicio.setTaxista(this.empresaDeta);
    }

    public String editar() throws Exception {
        this.accion = 2;
        this.titulo = "ACTUALIZAR EMPRESA";

        return this.url;
    }

    public void editarTaxista() {
        this.accionDetalle = 2;
        this.tituloDetalle = "EDITAR TAXISTA";
        if (this.empresaDeta.getId() != null) {
            try {
                this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public void editarAuto() {
        this.accionPopup1 = 2;
        this.tituloPopup1 = "EDITAR AUTO";
        if (this.auto.getId() != null) {
            try {
                this.auto = nTaxistaAuto.obtenerPorId(this.auto.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public void editarServicio() {
        this.accionPopup1 = 2;
        this.tituloPopup1 = "EDITAR SERVICIO";
        if (this.servicio.getId() != null) {
            try {
                this.servicio = nTaxistaServicio.obtenerPorId(this.servicio.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public String ver() {
        this.accion = 3;
        this.titulo = "VER EMPRESA";

        return this.url;
    }

    public void verTaxista() {
        this.accionDetalle = 3;
        this.tituloDetalle = "VER TAXISTA";
        if (this.empresaDeta.getId() != null) {
            try {
                this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public void verAuto() {
        this.accionPopup1 = 3;
        this.tituloPopup1 = "VER AUTO";
        if (this.auto.getId() != null) {
            try {
                this.auto = nTaxistaAuto.obtenerPorId(this.auto.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public void verServicio() {
        this.accionPopup1 = 3;
        this.tituloPopup1 = "VER SERVICIO";
        if (this.servicio.getId() != null) {
            try {
                this.servicio = nTaxistaServicio.obtenerPorId(this.servicio.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public String guardar() throws Exception {
        if (this.accion == 1) {
            Long id = Long.valueOf(nEmpresa.obtenerTodos().size() + 1);
            this.empresa.setId(id);
            this.empresa = generarUsuario(this.empresa);
            nUsuario.guardar(this.empresa.getUsuario());
            if (nEmpresa.guardar(this.empresa)) {
                this.empresa = nEmpresa.obtenerPorId(this.empresa.getId());
                enviarNotificacion(this.empresa);
                showMessage("SE HA GUARDADO CORRECTAMENTE");
                return this.editar();
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
                return null;
            }
        } else {
            if (nEmpresa.actualizar(this.empresa)) {
                this.empresa = nEmpresa.obtenerPorId(this.empresa.getId());
                showMessage("SE HA GUARDADO CORRECTAMENTE");
                return this.editar();
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
                return null;
            }
        }
    }

    public void guardarTaxista() {
        RequestContext context = RequestContext.getCurrentInstance();
        this.empresaDeta.setFechaNacimiento(new Timestamp(this.fechaNacimiento.getTime()));
        boolean resultado = true;
        try {
            if (this.accionDetalle == 1) {
                Long id = Long.valueOf(nEmpresaTaxista.obtenerTodos().size() + 1);
                this.empresaDeta.setId(id);
                if (nEmpresaTaxista.guardar(this.empresaDeta)) {
                    this.empresa.setNroTrabajadores(this.empresa.getNroTrabajadores() + 1);
                    nEmpresa.actualizar(this.empresa);
                    this.empresa = nEmpresa.obtenerPorId(this.empresa.getId());
                } else {
                    resultado = false;
                }
            } else {
                if (nEmpresaTaxista.actualizar(this.empresaDeta)) {
                    this.empresa = nEmpresa.obtenerPorId(this.empresa.getId());
                } else {
                    resultado = false;
                }
            }
        } catch (Exception e) {
            showError(e.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void guardarAuto() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            this.auto.setEmpTaxista(this.empresaDeta);
            if (this.accionPopup1 == 1) {
                Long id = Long.valueOf(nTaxistaAuto.obtenerTodos().size() + 1);
                this.auto.setId(id);
                if (nTaxistaAuto.guardar(this.auto)) {
                    this.empresaDeta.setCantAutos(this.empresaDeta.getCantAutos() + 1);
                    nEmpresaTaxista.actualizar(this.empresaDeta);
                    this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
                } else {
                    resultado = false;
                }
            } else {
                if (nTaxistaAuto.actualizar(this.auto)) {
                    this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
                } else {
                    resultado = false;
                }
            }
        } catch (Exception e) {
            showError(e.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void guardarServicio() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            this.servicio.setCliente(nCliente.obtenerPorId(this.idCliente));
            this.servicio.setFechaServicio(new Timestamp(this.fechaServicio.getTime()));
            if (this.accionPopup1 == 1) {
                Long id = Long.valueOf(nTaxistaServicio.obtenerTodos().size() + 1);
                this.servicio.setId(id);
                if (nTaxistaServicio.guardar(this.servicio)) {
                    this.empresaDeta.setCantServicios(this.empresaDeta.getCantServicios() + 1);
                    nEmpresaTaxista.actualizar(this.empresaDeta);
                    this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
                } else {
                    resultado = false;
                }
            } else {
                if (nTaxistaServicio.actualizar(this.servicio)) {
                    this.empresaDeta = nEmpresaTaxista.obtenerPorId(this.empresaDeta.getId());
                } else {
                    resultado = false;
                }
            }
        } catch (Exception e) {
            showError(e.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public String retroceder() {
        buscar(null);
        return this.urlLista;
    }

    private void enviarNotificacion(eEmpresa empresa) {
        String asunto = "CONFIRMACIÓN DE REGISTRO";
        String mensaje = "ESTIMADO USUARIO, PERUTAXI AGRADECE SU PREFERENCIA. SU USUARIO PARA EL INGRESO A LA WEB ES: " + empresa.getUsuario().getUsuario();
        mensaje += " Y SU CLAVE ES: " + empresa.getUsuario().getClave();
        JavaMail.send(empresa.getEmailEmpresa(), asunto, mensaje);
    }

    private eEmpresa generarUsuario(eEmpresa empresa) throws Exception {
        eUsuario usuario = new eUsuario();
        Long id = Long.valueOf(nUsuario.obtenerTodos().size() + 1);
        StringTokenizer tokens = new StringTokenizer(empresa.getRazonSocial());
        String clave = id + tokens.nextToken();
        usuario.setId(id);
        usuario.setUsuario(empresa.getRuc());
        usuario.setClave(clave);
        usuario.setIdRol(2L);
        usuario.setEstado(Boolean.TRUE);

        empresa.setUsuario(usuario);

        return empresa;
    }

    public eEmpresa getEmpresaFiltro() {
        return empresaFiltro;
    }

    public void setEmpresaFiltro(eEmpresa empresaFiltro) {
        this.empresaFiltro = empresaFiltro;
    }

    public eEmpresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(eEmpresa empresa) {
        this.empresa = empresa;
    }

    public List<eEmpresa> getLista() {
        return lista;
    }

    public void setLista(List<eEmpresa> lista) {
        this.lista = lista;
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public eEmpresaTaxista getEmpresaDeta() {
        return empresaDeta;
    }

    public void setEmpresaDeta(eEmpresaTaxista empresaDeta) {
        this.empresaDeta = empresaDeta;
    }

    public int getAccionDetalle() {
        return accionDetalle;
    }

    public void setAccionDetalle(int accionDetalle) {
        this.accionDetalle = accionDetalle;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public List<eTaxistaAuto> getListaAutos() throws Exception {
        return nTaxistaAuto.obtenerPorIdTaxista(this.empresaDeta.getId());
    }

    public void setListaAutos(List<eTaxistaAuto> listaAutos) {
        this.listaAutos = listaAutos;
    }

    public List<eEmpresaTaxista> getListaTaxistas() throws Exception {
        return nEmpresaTaxista.obtenerPorIdEmpresa(this.empresa.getId());
    }

    public void setListaTaxistas(List<eEmpresaTaxista> listaTaxistas) {
        this.listaTaxistas = listaTaxistas;
    }

    public SelectItem[] getSiEstadosSexo() {
        SelectItem[] si = new SelectItem[3];
        si[0] = new SelectItem("M", "MASCULINO");
        si[1] = new SelectItem("F", "FEMENINO");
        si[2] = new SelectItem("O", "OTRO");
        siEstadosSexo = si;

        return siEstadosSexo;
    }

    public void setSiEstadosSexo(SelectItem[] siEstadosSexo) {
        this.siEstadosSexo = siEstadosSexo;
    }

    public eTaxistaAuto getAuto() {
        return auto;
    }

    public void setAuto(eTaxistaAuto auto) {
        this.auto = auto;
    }

    public int getAccionPopup1() {
        return accionPopup1;
    }

    public void setAccionPopup1(int accionPopup1) {
        this.accionPopup1 = accionPopup1;
    }

    public String getTituloPopup1() {
        return tituloPopup1;
    }

    public void setTituloPopup1(String tituloPopup1) {
        this.tituloPopup1 = tituloPopup1;
    }

    public SelectItem[] getListaMarcas() {
        SelectItem[] si = new SelectItem[6];
        si[0] = new SelectItem("TOYOTA", "TOYOTA");
        si[1] = new SelectItem("KIA", "KIA");
        si[2] = new SelectItem("CHEVROLET", "CHEVROLET");
        si[3] = new SelectItem("CHERY", "CHERY");
        si[4] = new SelectItem("RENAULT", "RENAULT");
        si[5] = new SelectItem("VOLKSWAGEN", "VOLKSWAGEN");

        this.listaMarcas = si;

        return listaMarcas;
    }

    public void setListaMarcas(SelectItem[] listaMarcas) {
        this.listaMarcas = listaMarcas;
    }

    public SelectItem[] getListaModelos() {
        SelectItem[] si = new SelectItem[5];
        si[0] = new SelectItem("TOYOTA YARIS 2014", "TOYOTA YARIS 2014");
        si[1] = new SelectItem("TOYOTA PRIUS C", "TOYOTA PRIUS C");
        si[2] = new SelectItem("TOYOTA AURIS", "TOYOTA AURIS");
        si[3] = new SelectItem("TOYOTA YARIS SEDAN", "TOYOTA YARIS SEDAN");
        si[4] = new SelectItem("TOYOTA COROLLA", "TOYOTA COROLLA");

        if (this.auto != null) {
            if (this.auto.getMarca().equals("TOYOTA")) {
                si[0] = new SelectItem("TOYOTA YARIS 2014", "TOYOTA YARIS 2014");
                si[1] = new SelectItem("TOYOTA PRIUS C", "TOYOTA PRIUS C");
                si[2] = new SelectItem("TOYOTA AURIS", "TOYOTA AURIS");
                si[3] = new SelectItem("TOYOTA YARIS SEDAN", "TOYOTA YARIS SEDAN");
                si[4] = new SelectItem("TOYOTA COROLLA", "TOYOTA COROLLA");
            } else if (this.auto.getMarca().equals("KIA")) {
                si[0] = new SelectItem("KIA QUORIS", "KIA QUORIS");
                si[1] = new SelectItem("KIA NEW SORENTO", "KIA NEW SORENTO");
                si[2] = new SelectItem("KIA RIO", "KIA RIO");
                si[3] = new SelectItem("KIA PICANTO", "KIA PICANTO");
                si[4] = new SelectItem("KIA CARNIVAL", "KIA CARNIVAL");
            } else if (this.auto.getMarca().equals("CHEVROLET")) {
                si[0] = new SelectItem("CHEVROLET CRUZE", "CHEVROLET CRUZE");
                si[1] = new SelectItem("CHEVROLET AVEO SEDAN", "CHEVROLET AVEO SEDAN");
                si[2] = new SelectItem("CHEVROLET SAIL", "CHEVROLET SAIL");
                si[3] = new SelectItem("CHEVROLET SONIC", "CHEVROLET SONIC");
                si[4] = new SelectItem("CHEVROLET SPARK LT", "CHEVROLET SPARK LT");
            } else if (this.auto.getMarca().equals("CHERY")) {
                si[0] = new SelectItem("CHERY QQ", "CHERY QQ");
                si[1] = new SelectItem("CHERY FACE", "CHERY FACE");
                si[2] = new SelectItem("CHERY SKIN", "CHERY SKIN");
                si[3] = new SelectItem("CHERY FULWIN", "CHERY FULWIN");
                si[4] = new SelectItem("CHERY FULWIN XR", "CHERY FULWIN XR");
            } else if (this.auto.getMarca().equals("RENAULT")) {
                si[0] = new SelectItem("RENAULT SANDERO", "RENAULT SANDERO");
                si[1] = new SelectItem("RENAULT LOGAN", "RENAULT LOGAN");
                si[2] = new SelectItem("RENAULT KOLEOS", "RENAULT KOLEOS");
                si[3] = new SelectItem("RENAULT FLUENCE", "RENAULT FLUENCE");
                si[4] = new SelectItem("RENAULT DUSTER", "RENAULT DUSTER");
            } else if (this.auto.getMarca().equals("VOLKSWAGEN")) {
                si[0] = new SelectItem("VOLKSWAGEN GOL SEDAN", "VOLKSWAGEN GOL SEDAN");
                si[1] = new SelectItem("VOLKSWAGEN PASSAT", "VOLKSWAGEN PASSAT");
                si[2] = new SelectItem("VOLKSWAGEN BORA", "VOLKSWAGEN BORA");
                si[3] = new SelectItem("VOLKSWAGEN POLO", "VOLKSWAGEN POLO");
                si[4] = new SelectItem("VOLKSWAGEN GTI", "VOLKSWAGEN GTI");
            }
        }

        this.listaModelos = si;

        return listaModelos;
    }

    public void setListaModelos(SelectItem[] listaModelos) {
        this.listaModelos = listaModelos;
    }

    public SelectItem[] getListaColores() {
        SelectItem[] si = new SelectItem[5];
        si[0] = new SelectItem("AZUL", "AZUL");
        si[1] = new SelectItem("ROJO", "ROJO");
        si[2] = new SelectItem("NEGRO", "NEGRO");
        si[3] = new SelectItem("BLANCO", "BLANCO");
        si[4] = new SelectItem("PLOMO", "PLOMO");
        this.listaColores = si;

        return listaColores;
    }

    public void setListaColores(SelectItem[] listaColores) {
        this.listaColores = listaColores;
    }

    public Date getFechaNacimiento() {
        if (this.accionDetalle == 2 || this.accionDetalle == 3) {
            this.fechaNacimiento = this.empresaDeta.getFechaNacimiento();
        }

        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public List<eTaxistaServicio> getListaServicios() throws Exception {
        return nTaxistaServicio.obtenerPorIdTaxista(this.empresaDeta.getId());
    }

    public void setListaServicios(List<eTaxistaServicio> listaServicios) {
        this.listaServicios = listaServicios;
    }

    public eTaxistaServicio getServicio() {
        return servicio;
    }

    public void setServicio(eTaxistaServicio servicio) {
        this.servicio = servicio;
    }

    public Long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Long idCliente) {
        this.idCliente = idCliente;
    }

    public List<eCliente> getListaClientes() throws Exception {
        return nCliente.obtenerActivos();
    }

    public void setListaClientes(List<eCliente> listaClientes) {
        this.listaClientes = listaClientes;
    }

    public Date getFechaServicio() {
        if (this.accionPopup1 == 2 || this.accionPopup1 == 3) {
            this.fechaServicio = this.servicio.getFechaServicio();
        }

        return fechaServicio;
    }

    public void setFechaServicio(Date fechaServicio) {
        this.fechaServicio = fechaServicio;
    }

    public List<eTaxistaReclamo> getListaReclamos() throws Exception {
        return nTaxistaReclamo.obtenerPorIdTaxista(this.empresaDeta.getId());
    }

    public void setListaReclamos(List<eTaxistaReclamo> listaReclamos) {
        this.listaReclamos = listaReclamos;
    }
}